# 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
#
# 请你找出并返回 strs 的最大子集的大小，该子集中 最多 有 m 个 0 和 n 个 1 。
#
# 如果 x 的所有元素也是 y 的元素，集合 x 是集合 y 的 子集 。
#
# 来源：力扣（LeetCode）
# 链接：https://leetcode-cn.com/problems/ones-and-zeroes
# 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
from typing import List


class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        if len(strs) == 0:
            return 0
        dp = [[0] * (n + 1) for _ in range(m + 1)]
        for strs_item in strs:
            zeros = strs_item.count("0")
            ones = strs_item.count("1")
            for i in range(m, zeros - 1, -1):  # 从后往前 保证i>=zeros
                for j in range(n, ones - 1, -1):  # 保证 j>=ones
                    dp[i][j] = max(dp[i][j], 1 + dp[i - zeros][j - ones])
        return dp[m][n]


if __name__ == '__main__':
    sol = Solution()
    print(sol.findMaxForm(strs=["10", "0001", "111001", "1", "0"], m=5, n=3))
